23

» WarCraft 3 / Как сделать тим колор

Похожие вопросы:

ответ
советую переименовать модель\заребутить комп
текстуры стандартные юзал, я так понимаю
ответ
~8gabriel8:
Невозможно дать тимколор декорации. Можно ставить нужный тимколор в 3D-редакторе mdlvis, либо делать декорации из зданий, которым дана способность Москиты (Aloc).

23

» WarCraft 3 / Помощь

Похожие вопросы:

ответ
такое чувство будто моё сообщение проигнорили

Поменяй максимум пищи на ограничение пищи

23

» WarCraft 3 / дальность атаки

Похожие вопросы:

ответ
XGM Bot:
Похожие вопросы:

ответ
lll_Kirito_lll:
Так что за прием со сферой?
Ставишь юниту в разделе Бой - Атаки на Нет, потом делаешь две способности на базе одной из сфер (например Предмет: электрическая атака), у одной из них Включен индекс атаки - 1, у другой - 2. Добавляешь первую способность юниту в РО. Когда тебе нужно изменить дальность атаки - удаляешь ту способность сферы, которая есть у юнита и добавляешь другую. Правда при этом не будет видно иконки атаки.
ответ
  1. Способность "Склад" убирает атаку. Нужна атака - не добавляй "Склад".
  2. Без дополнительных выкрутасов - нет.
ответ
Вообще в мемхаке есть же.
Но новички в картостроительстве, большинство серверов и отчасти последний патч варкрафта в мемхак не понимают.
ответ
Морф в другого героя, можно практически без кода, про руны и морфы была статья.
Так же мемхаком можно редактировать параметры атаки.
xgm.guru/p/wc3/powerups вот линк
ответ
Если не ошибаюсь - нужно еще дистанцию получения приказа поднять

ответ
так это самый простой вариант там приказ сам отлавливать .а не замах я так к примеру написал ( но гемора с проверками будет много мне кажется )
можно еще посути менять дистанцию получение приказа на отаку менять у юнита
call SetUnitAcquireRangeBJ( gg_unit_Hblm_0000, 100.00 )
кароч сделал только до ума довести нужно но вроде все работает.
ответ
Для увеличения дальности атаки используют улучшение на основе длинностволых мушкетов. Добавить всем героям это улучшение после чего при получении предмета выставляется уровень улучшения функцией SetPlayerTechResearched
ответ
~8gabriel8:
Просто улучшение на основе Длинноствольных мушкетов Альянса.
ответ
А как эту дистанцию получения приказа настроить?
РО -> атака: дальность получения приказа в свойствах юнита.

23

» WarCraft 3 / Герой не наносит урон

Похожие вопросы:

ответ
Баг абилки
исправляется с помощью тригга - добавляем анимационный таг, счетчик для количества ударов и даем руну на морф с другим типом атаки\бонус к урону\...
само собой абилку заменяем другой, можно на основе канала
ответ
Юнит атакует, ждать время точки повреждения, потом ждать расстояние до цели атакованного юнита, деленное на скорость снаряда. Но промах учитываться не будет конечно. Можно как-то попробовать через юнит получает урон.
ответ
Сделать области (безопасные зоны).
Периодическое событие - каждую секунду.
Условие - время > 6.00 и время < 18.00.
Действие - если герой не в области 1 или герой не в области 2 и т. д., то уменьшить жизнь на 85.00.
ответ
Вот держи. За подробностями в вк можешь обратится и если такое дело помогу доработаю систему на jass ( мой вк - vk.com/id446544976 )
ответ
  1. событие урона показывает сколько нанесет урона сейчас, но урон еще не пришел. урон происходит через 0.00 сек.
  2. у вас может быть в этот момент максимальный запас здоровья (например у курицы 10 хп). А урон противника получается слишком большим.
раскрыть
  • 2.1. Манипуляциями с хп через команды типа set life of unit вы не всегда можете наперед подправлять. Тк хп может упереться в лимит запаса здоровья юнита. А получаемый урон больше чем запас, и юнит умрет.
  • 2.2. Можно сделать юнита временно неуязвимым, тогда атака не срабатывает
2.3.поэтому самое идеальное даем абилку с максимальным запасом здоровья с 999999к хп. Юнит точно не умрет от урона.
после таймера 0.00 сек убираем абилу и подправляем как надо.
ты можешь делать проверки сколько очков осталось на поглощение

Nemezid, это незаметно, тк все происходит очень быстро.

23

» WarCraft 3 / ИИ

Похожие вопросы:

ответ
вопросы типа сделайте за меня не принимаются
по поводу того как это делать написано здесь xgm.guru/p/wc3/articles
ответ
BrEd Pitt, что значит использовать
берёшь и создаёшь юнитов для резервного игрока а потом отдаёшь им приказ
ответ
Возможно listfile.txt повредился.
Перекачай его.
ответ
есть событие - юнит получает урон. в нём отслеживается как жертва, так и наносящий урон. можно хоть через хэш, хоть через структуру Юнита записывать всё, что угодно. Кто от кого конкретно сколько получил урона, кто кому сколько нанёс, сколько провисел на ком-то бафф яда и т.п. (Сначала был loop, а теперь периодический триггер). Каждые N секунд, перебираешь всех юнитов в массиве или списке, и отслеживаешь всё, что надо.
Структура - Unit. У неё есть двойной список с юнитами и уроном от яда (полученным или нанесённым - зависит от того, у кого будет этот список - у жертв или у тех, кто наносит яд). Типа DoubleList. В DoubleList есть элементы DoubleElement. В каждом таком элементе записаны unit и real (урон от яда от этого юнита). При получении урона от яда перебирается список, если юнит уже есть, урон от него (или ему) прибавляется. Если нет, то создаётся новый элемент с новым юнитом.
Периодически у нужных юнитов эти списки перебираются. Всё.
ответ
Diazon, прочти статьи по массивам/структурам
после чего юзай двухмерные массивы/поля-массивы

23

» WarCraft 3 / Свечение героев в рефорже

Похожие вопросы:

ответ
Я так понимаю это по поводу того же вопроса?
Совсем недавно появился русификатор для рефа, у меня рефа, конечно же, нет, но тебе, вероятно, поможет)

23

» WarCraft 3 / бонусы скорости атаки от ловкости

Похожие вопросы:

ответ
Поскольку его не пугает наличие большого влияния промахов на геймплей - скорее всего он делает рпг. Имхо в рпг всегда клево смотрятся тексттаги полученного урона, для создания которых необходимы триггеры на отлов получения урона. А отлавливаемый урон - можно и прохилить.
Для прохила(и вообще всех манипуляций с задержкой в 0.00 сек) лично я юзаю такие костыли:
Либа здесь только для доп табуляции. Я за чистый жасс + дефайны.
library ZeroTimeEvent

    globals
        constant integer ZTEArraySize = 64//Even 32 is alot, 64 is too much! Exactly what I need!
        timer Zero//Used for 0. sec uses
        integer ZTECurrent = 0
        unit array ZTEUnits[ZTEArraySize]
        integer array ZTEIntegers[ZTEArraySize]
        real array ZTEReals[ZTEArraySize]
        trigger array ZTETriggers[ZTEArraySize]
    endglobals
    
    function ZeroTimeEvent takes nothing returns nothing
            loop
                set  ZTECurrent = ZTECurrent - 1
                call TriggerExecute( ZTETriggers[ZTECurrent] )
                exitwhen ZTECurrent < 1
            endloop
    endfunction
    
    #define ZTEAddUnit(u) = {
        set  ZTEUnits[ZTECurrent] = u
    }
    
    #define ZTEAddInteger(i) = {
        set  ZTEIntegers[ZTECurrent] = i
    }
    
    #define ZTEAddReal(r) = {
        set  ZTEReals[ZTECurrent] = r
    }
    
    #define ConfirmZTE(trig) = {
        set  ZTETriggers[ZTECurrent] = trig
        set  ZTECurrent = ZTECurrent + 1
        call TimerStart( Zero, ZeroTime, false, function ZeroTimeEvent )
    }
    
    
    
endlibrary
Пример использования
#define UnitRemoveForceAttack(u) = {
    call UnitAddAbility( u, 'Abun' )
    call UnitRemoveAbility( u, 'Abun' )
         ZTEAddUnit(u)
         ConfirmZTE(CheckIfUnitHasA002)
}
Минус такой системы в необходимости создавать триггер для каждого блока кода, т.к. массивы блоков кода запрещены
ответ
что-то не вижу на скрине как вы пытаетесь запихнуть в if/then/else. Почему должен угадывать
Предположение: ошибка - локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед, наверное, поставил действие "if/then/else", а потом начал объявлять что-то там,
правильно
local unit u
if (условие) then
	действие
endif
не правильно
if (условие) then
	local unit u
endif
Локалки вначале функции всегда объявляются. Можете в код конвентировать и посмотреть.
вейты не юзайте лучше, используйте таймер. Он поток паузит, еще работает во время паузы, и не точен .
ответ
посмотри как у урсы сделано
Там и скорость атаки (со счетчиком ударов) есть и алгоритм добавления зеленого урона
ответ
  1. Есть функция проверки кол-ва ловкости героя, при этом можно посмотреть сколько ловкости от характеристик и сколько от предметов, исходя из кол-ва ловкости вручать предметные абилки на атаку.
  2. Самое простое - апгрейды, триггерно повышать уровень улучшения которое будет действовать на героя, увы это не идеальный вариант, но один из самых просты. Так же вручать способности предметов на регенерацию здоровья \ маны.
  3. Напрямую - никак, есть место только под 5 способностей. Делать свою систему прокачки способностей из спеллбука или какие либо еще способы, на подобии рпгшных карт.
ответ
Разобрался в чём дело. Может там где-то что-то и не донулил, но основная причина утечек из-за триггеров d1 и d2
Способность выложил у себя в блоге, там буду её обновлять (если это почему-то интересно)

23

» WarCraft 3 / Команды триггера

Похожие вопросы:

ответ
старый запрос
ответ
~8gabriel8:
Заносишь бараки в массив переменной B. Задаёшь целочисленную переменную Ir = (случайное число от 0 до 3). Отдаёшь приказ на постройку юнита B(Ir).
ответ
Событие юнит получает урон регистрируется на конкретного юнита.
Для того что бы отлавливать урон по цели твоего "щита", нужно создать для цели (т.е. для того юнита, на которого накладывают щит) отдельное событие на получением им урона. И делать это надо именно в тот момент, когда ты накладываешь щит.
Для этого есть функция добавить событие в триггер, в ней можно указать конкретного юнита и само событие получения урона. Дальше тебе придётся только лишь определить был ли юнит в момент получения урона под действием "щита" и дальше блокировать урона (восстанавливать хп юнита).
Так же надо отметить момент, что если ты для юнита создаёшь больше ОДНОГО события на получение урона - они будут работать каждый сам по себе (т.е. при получении урона 1 раз, будут срабатывать 2 события, и триггер будет срабатывать ДВА раза = больше события и больше срабатываний в один момент времени).
Для этого надо маркеровать юнитов, для которых создаётся событие на получение урона (например заносить их в группу юнитов, а перед этим проверять есть ли юнит в этой группе).
ответ
не давно был вопрос и есть возможно реализовать вывод через MME

ответ
Команда работает как раз-таки. А вот то, что в самих триггерах - нет.

23

» WarCraft 3 / Нестандартная декорация

Похожие вопросы:

ответ
Мне кажется, что добавить простенькую анимацию исчезновения, длинною в кадр было бы самым разумным и простым решением. Научу в личке, если хочешь.
ответ
почему так долго грузится карта
Потому что огромный Нестандартные объекты может тысяч или больше или Спелл герой до 100 уровень.
из них 60 загрузка просто висит на 1/5.
Если нетак? Проверь если есть файлы war3map.j папка Game\WarcraftIII, надо удалить файл. очень давно тоже 1 раз что за вылет или неправильно выполняет триггер.
Есть способы ускорить загрузку карты не экономя в редакторе объектов
Есть Widgetizer, там очень быстрая загрузка игра, но плохо работает спелл или текст.
ответ
Мы уже долго ведем дискусию по этому вопросу лудший способ зделай здание с необходомой тебе моделью и дай москитов.
ответ
~8gabriel8:
Невозможно дать тимколор декорации. Можно ставить нужный тимколор в 3D-редакторе mdlvis, либо делать декорации из зданий, которым дана способность Москиты (Aloc).
ответ
Сам разобрался - рассчитал границы в Model Editor`e.

23

» WarCraft 3 / Проблема с источниками частиц

Похожие вопросы:

ответ
закрыт по таймауту
ответ
делай хелпер к источнику частиц с теми же координатами, и поворачивай его когда нужно
ответ
~8gabriel8:
Какие именно эффекты в модели дублировал, а какие создал с нуля? Надо попытаться сравнить эти эффекты, сохранив модель в формат mdl и открыв в блокноте. Может быть дело даже не в самих эффектах, а в упоминании где-то их ID.
ответ
текстура у источника есть? после дублирования она отсутствует

23

» WarCraft 3 / Транспортное средство

Похожие вопросы:

ответ
Ярг Восьмой:
Есть вариант оперировать при помощи морфа, превращая воздушную единицу в наземную. Что-то вроде имитировании посадки на аэродром. это можно сделать через отлов приказов с проверкой расстояния между единицей и зданием, а также при выгрузке просто отлавливать выгруженную единицу, и морфить обратно влетающую.
ответ
у миньона, который указан в DataD, должен быть уровень меньше, чем у цели, либо у миньона раса должна быть не demon
ответ
~8gabriel8:
Зверобойщик, во-первых, триггеры варика по сути представляют собой упрощённое программирование, ими делают свой движок игры, если нужно, например, симулятор гонок, шутера, РПГ с видом от третьего лица, даже авиасимулятор и прочее. Если ты в них не разбираешься, либо разбираешься очень плохо, то более половины своих идей не сможешь реализовать. Говорю по жизненному опыту, в детстве научился в редакторе карт к Героям 3 делать полноценные карты и кампании без триггеров, думал, что и к остальным играм так легко смогу что-то делать, но не тут-то было!
Во-вторых, возможность носить несколько видов оружия у юнита ты преподносишь как нечто обязательное, но если для людей и орков это ещё будет нормально, то вурдалаки нежити сражаются только своими когтями, а хрупкие лучницы ночных эльфов не будут в руки тяжеленные молоты брать, чтобы померяться силой с мужиками в ближнем бою. Помимо отсутствия в войнах древности летающих юнитов, есть ли там водоплавающие? Это всё проблемы, которые ты хочешь на потом отложить, но это те проблемы, которые нужно сразу как-то решить, чтобы понять урезанность своей идеи, либо даже полную невозможность осуществления.
В-третьих, почему-то только четыре картинки отображается, судя по которым, способности в войнах древности в целом имеют свои аналоги в варике, но опять же не те, которые выше упомянул. А упомянул не случайные способности, а такие, которые затруднительно было бы реализовать, если в игре нет аналогов. Как реализуешь поднятие скелетов из трупа, например? Оно обязательно нужно - это ключевая особенность нежити.
В-четвёртых, под устройством файлов подразумевал, что ты умеешь открывать архивы игры, форматы изображений и прочих файлов, а также знаешь, почему там что-то сделано так, а не иначе. Например, в варике текстуры почвы представляют собой изображение 256х512 или 256х256 в зависимости от того, будет ли текстура накладываться сверху на другие при соприкосновении, либо всегда будет снизу. Если будет накладываться, то левая часть изображения поделена на зоны 4х4, в каждой из которых указан вариант для разных вариантов соприкосновения текстур, в правой части тоже зоны 4х4, где каждый кусочек полноценной текстуры земли имеет небольшие изменения, чтобы в редакторе почва получалась разнообразной (где-то камень, где-то кочка, где-то полевые цветы), а не наскучивала неестественностью игроку. То есть нельзя просто любое изображение туда поставить, в игре будет смотреться шахматной доской, а не единым пространством.
В-пятых, если почитаешь про этот проект, то изначально Armies of Azeroth не делались под Starcraft 2, а были обновлением моделек для варика под названием Reborn или Resurrection, запамятовал точное название. Мотивы их перехода на другой движок мне неизвестны, но вроде как это было одним из условий объединения двух или более проектов (вроде бы трёх), которые по отдельности вряд ли бы были доведены до конца. Это к тому, что идеей создания новых моделек всерьёз горело множество талантливых людей, и они смогли довести дело до конца, лишь скооперировавшись на международном уровне. А у тебя единомышленников, насколько понимаю, нет?
В-шестых, почти не играю, не хочется касаться нового, сейчас акцент в играх на графику и мультиплеер смещён, либо казуальщину, а мне нравится наслаждаться глубоким сюжетом в одиночку)
P. S. Даже не трать время и энергию на уговоры.
В-седьмых, переносные или подвозные лестницы, тут не столь принципиально. В зависимости от модели лестницы будет своя реализация. В твоём случае потребуется модель переносчика лестницы с анимацией, как он её ставит. Потом лестница у него исчезает и сразу появляется на её месте декорация лестницы из категории Мосты и подъёмы. Тут долго всё это описывать, скажу только, что поднимается по ней юнит гладко, проверял много раз)

23

» WarCraft 3 / Добыча камня

Похожие вопросы:

ответ
Поиграйся с орбэффектами, добавляя в разрешённые цели необходимую клиссификацию. А вообще, просто поступи так:
Атака есть изначально, но при ударе юнитом по камню или дереву, проверка, имеет ли он кирку, и если да, тогда ролить переменную от N до N, и если равно N - создать такой то ресурс.
Можно также сделать систему с уровнем кирки(ну типа деревянная каменная железная алмазная окда), и по уровню кирки определять коилчество последовательностей "Иначе": Роллить первое число от 1 до 100 - камень. Если не выпал, но кирка у тебя выше деревянной - Роллить от 1 до 200 - железо. Если не выпало, но кирка выше каменной - роллить от 1 до 1000 - аметист, и т.д.
ответ
Попробуй эту систему. Правда, в мультиплеере она не тестировалась.
ответ
Daniil33, нет, надо через if-then-else проверять, что камень там еще "живой", и если нет, создавать новый и заносить в переменную.
И так циклом для каждой области
Сами области в массив заносить при инициализации карты

23

» WarCraft 3 / Как убрать выбор игрока при запуске карты?

Похожие вопросы:

ответ
Если запускаемая сложность главы отличается от стандартной, то оставить так, как есть, а если нет - то попытаться считать то, что было записано в предыдущей главе (если не записано - сбросить к стандартной).
Вообще, сама функция не запускает уровень с какой-то сложностью. Она просто задает значение глобальной переменной:
Код функции
function SetNextLevelBJ takes string nextLevel returns nothing
    if (nextLevel == "") then
        set bj_changeLevelMapName = null
    else
        set bj_changeLevelMapName = nextLevel
    endif
endfunction
Если копать глубже, то вся проблема здесь:
Код функций
function CustomVictoryOkBJ takes nothing returns nothing
    if bj_isSinglePlayer then
        call PauseGame( false )
        // Bump the difficulty back up to the default.
        call SetGameDifficulty(GetDefaultDifficulty())
    endif

    if (bj_changeLevelMapName == null) then
        call EndGame( bj_changeLevelShowScores )
    else
        call ChangeLevel( bj_changeLevelMapName, bj_changeLevelShowScores )
    endif
endfunction

function CustomVictoryQuitBJ takes nothing returns nothing
    if bj_isSinglePlayer then
        call PauseGame( false )
        // Bump the difficulty back up to the default.
        call SetGameDifficulty(GetDefaultDifficulty())
    endif

    call EndGame( bj_changeLevelShowScores )
endfunction
Если интересно, откуда все это берется, то нужно посмотреть устройство функции CustomVictoryBJ и все вызовы, следующие из нее.
Чтобы править проблему без создания костылей на кэше, то придется переписать близовскую функцию под себя (без сбрасывания сложности), а потом использовать ее вместо оригинальной в своей кампании (удобства ради можно использовать дефайн на cJass).
ответ
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode

23

» WarCraft 3 / Проглотить

Похожие вопросы:

ответ
способности кодоя (ээх посмотрел бы):
Проглотить 'Adev' - проглатывает указанное существо и переваривает, нанося урон указанный в скиле "Еда"
Еда 'Advc' - здесь можно указать сколько урона наносит перевариваемым существам в секунду. И сколько может вместить в желудок существ.
Эти способности друг с другом связаны
ответ
leroydraigo, просто надо пассажира от труповозки использовать. Всё работает.
ответ
Нет ошибки. Максимальный уровень монстров применяется только для нейтрально-враждебных жертв зверя. То есть, если у жертвы будет какая-либо раса, в редакторе объектов, отличная от "монстров", то ограничения уровня применяться не будут.
ответ
rsfghd:
Как узнать, кушает ли юнит кого-нибудь в данный момент или нет?
По наличию баффа Bdvv у него.
Если есть бафф = он переваривает кого-то.

rsfghd:
а как я найду того самого кодоя, что его съел?
Записывай пары юнитов в момент каста.
ответ
Да, не работает по воздушным ограничение движка.
Решение только тригерный аналог.

23

» WarCraft 3 / Кастомная озвучка проблемы

Похожие вопросы:

ответ
"Набор звуков" нельзя сделать через триггеры, но можно попробовать через импорт файлов заменить стандартные файлы в уже существующих наборах.
Для этого импортируемому файлу надо прописать путь заменяемого.
ответ
~8gabriel8:
Это особенность патча 1.30, на 1.26 всё нормально с этим. Может быть попробовать поменять приоритет кампании в файле priority, в статье про mix-архив это подробнее описано.

23

» WarCraft 3 / Вопрос об эффектах

Похожие вопросы:

ответ
Пассивки в книге заклинаний работают, даже если запретить доступность самой книги для игрока.Так что да.
ответ
Только дебаффы ядовитых стрел могут стакатся, но даммик обязан иметь дальнюю атаку (при условии что у разных абилок ядовитых стрел будут разные баффы в настройках).
Так же можно юзать таймер и ауру торнадо как написали выше, ну если уж совсем нужен сложный бафф как дефолтный - то тут триггер и немного гемора с мемхаком, зато полный комплект параметров (мигает иконка в статусе перед завершением время действия, бафф спадает с цели после диспела, смерти (у цели крест перерождения или аналог), складывается или не складывается в зависимости от кода).
Пример не рекомендуемый к повторению
function FormatAirportTrainingBar takes integer fp_n returns string
    local string str = ""

    if ( fp_n <= 0 ) then
        return str
    endif

    loop
        exitwhen fp_n < 10
        if ( udg__TempBarStyle == 0 ) then
            set str = str + "''''''''''"
        else
            set str = str + "||||||||||||||||||||"
        endif
        set fp_n = fp_n - 10
    endloop

    loop
        exitwhen fp_n <= 0
        if ( udg__TempBarStyle == 0 ) then
            set str = str + "'"
        else
            set str = str + "||"
        endif
        set fp_n = fp_n - 1
    endloop

    return str
endfunction

function UpdateAirportTrainingBar takes texttag tt, integer fp_nTick, integer fp_nTickMax returns nothing
    local integer nProgress
    local integer nLen
    local string strTT1
    local string strTT2

    if ( tt == null ) then
        call BJDebugMsg( "text tag hDZzRwuZxFQcXqaMPnML null" )
        return
    endif

    set nLen = R2I( I2R( fp_nTickMax ) / 300 * 100 )
    set nProgress = R2I( I2R( nLen ) / fp_nTickMax * fp_nTick )
    set strTT1 = "" + FormatAirportTrainingBar( nProgress )
    set strTT2 = FormatAirportTrainingBar( nLen - nProgress ) + ""
    call SetTextTagText( tt, "|cff0080c0" + strTT1 + "|r|cffff0000" + strTT2 + "|r", 0.023 )
endfunction

function Get_Staff_of_Purification takes unit runner returns item
    set bj_forLoopAIndex = 0
    set bj_lastCreatedItem = null
    
    if GetUnitAbilityLevel( runner, 'Arun' ) == 0 then
        return null
    endif
    
    loop
        exitwhen bj_forLoopAIndex > 5

        set bj_lastCreatedItem = UnitItemInSlot( runner, bj_forLoopAIndex )
        if GetItemTypeId( bj_lastCreatedItem ) == 'I01A' then
            return bj_lastCreatedItem
        endif

        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop

    return bj_lastCreatedItem
endfunction

function Trig_RunnerDamageDetect_Conditions takes nothing returns boolean
    if GetTriggerEventId( ) == EVENT_UNIT_DAMAGED then
        return GetEventDamage( ) > 0.00 and GetEventDamageSource( ) != GetTriggerUnit( ) and GetEventDamageSource( ) != DummyAttacker
    endif
    return true
endfunction

function HealRunner takes nothing returns nothing
    local DamageData dd = GetDataBX( GetExpiredTimer( ) )
    
    call UnitRemoveAbility( dd.attacked, 'AMhp' )
    call SetUnitState( dd.attacked, UNIT_STATE_LIFE, dd.hp )
    
    call RemoveDataBX( dd.trix )
    call DestroyTimer( dd.trix )
    call dd.clear( )
    call dd.destroy( )
endfunction

function Trig_RunnerDamageLock_Actions takes nothing returns nothing
    local TriggerData st = GetDataBX( GetTriggeringTrigger( ) )
    local DamageData dd
    local eventid id = GetTriggerEventId( )
    
    if id == EVENT_GAME_TIMER_EXPIRED and st.id < st.time and st.attacked != null then
        set st.id = st.id + 1
        if GetUnitAbilityLevel( st.attacked, 'Bcyc' ) > 0  or GetUnitAbilityLevel( st.attacked, 'Bcy2' ) > 0 then
            call SetTextTagPos( st.tt, GetUnitX( st.attacked ) - 60.00, GetUnitY( st.attacked ) - 60.00, 585.00 )
        else
            call SetTextTagPos( st.tt, GetUnitX( st.attacked ) - 60.00, GetUnitY( st.attacked ) - 60.00, 80.00 + GetUnitFlyHeight( st.attacked ) )
        endif
        call UpdateAirportTrainingBar( st.tt, 100 - R2I( st.dmg / st.hp * 100.00 ), 100 )
        
    elseif id == EVENT_UNIT_DAMAGED and st.dmg < st.hp then
        set dd = DamageData.create( )
        set dd.trix = CreateTimer( )
        set dd.attacked = st.attacked
        set dd.dmg = GetEventDamage( )
        set dd.hp = GetUnitState( dd.attacked, UNIT_STATE_LIFE )
        
        call SetDataBX( dd.trix, dd )
        call UnitAddAbility( dd.attacked, 'AMhp' )
        call SetUnitState( dd.attacked, UNIT_STATE_LIFE, dd.hp + dd.dmg )
        
        call TimerStart( dd.trix, 0.00, false, function HealRunner )
        
        set st.dmg = st.dmg + dd.dmg
    else
        call UnitRemoveAbility( st.attacked, 'A08L' )
        call UnitMakeAbilityPermanent( st.attacked, false, 'A08L' )
        call DisableTrigger( st.trg )
        call SetTextTagVisibility( st.tt, false )
        
        if not IsUnitDead( st.attacked ) then
            call UnitRemoveAbility( st.attacked, 'B00A' )
        endif
        
        call RemoveSavedInteger( gg_htb_HashData, ExKeySoPRunner, GetHandleId( st.attacked ) )
        
        call st.RemoveTrigger( )
        call st.destroy( )
    endif
    
    set id = null
endfunction

function Trig_Staff_of_Purification_Actions takes nothing returns nothing
    local TriggerData dd
    local unit Runner = GetSpellAbilityUnit( )
    local integer RunnerId = GetHandleId( Runner )
    local item Staff = LoadItemHandle( gg_htb_HashData, RunnerId, ExKeySoP )
    local integer ChargesCount = 0
    local trigger trig = LoadTriggerHandle ( gg_htb_HashData, ExAtomShield, RunnerId )
    local integer pBuff
    
    if Staff == null then
        set Staff = Get_Staff_of_Purification( Runner )
         
        if Staff == null then
            //call DisplayTextToPlayer( Player( CrashPlayerNumber ), 0.00, 0.00, I2Sx( 'A01Q', CrashPlayerNumber ) )
            call BJDebugMsg( DEBUG + I2Sx( 'A02O', 0 ) + INFO )
            return
        endif
        
        call SaveBoolean( gg_htb_HashData, RunnerId, ExKeyHasStaff, true )
        call SaveItemHandle( gg_htb_HashData, RunnerId, ExKeySoP, Staff )
    endif
    
    set ChargesCount = GetItemCharges( Staff )
    
    if ChargesCount < 1 then
        set Runner = null
        set Staff = null
        set trig = null
        return
    endif
    
    call SetItemCharges( Staff, 0 )
    
    if trig != null then // блокирующие урон способности не складываются.
        call TriggerExecute( trig )
        set trig = null
    endif
    
    set dd = TriggerData.create( )
    set dd.attacked = Runner
    set dd.pl = GetOwningPlayer( Runner )
    set dd.trg = CreateTrigger( )
    set dd.trc = TriggerAddCondition( dd.trg, Condition( function Trig_RunnerDamageDetect_Conditions ) )
    set dd.tra = TriggerAddAction ( dd.trg, function Trig_RunnerDamageLock_Actions )
    set dd.tt = CreateTextTag( )
    set dd.hp = 1000.00 * ChargesCount
    set dd.dmg = 1.00
    set dd.id = 0
    set dd.time = 480
    set dd.c = 0.03125
    
    call UnitAddAbility( Runner, 'A07E' )
    call UnitRemoveAbility( Runner, 'A07E' )
    call UnitAddAbility( Runner, 'A08L' )
    call UnitMakeAbilityPermanent( Runner, true, 'A08L' )
    
    call SetDataBX( dd.trg, dd )
    call SaveInteger( gg_htb_HashData, ExKeySoPRunner, RunnerId, dd )
    
    call TriggerRegisterPlayerEvent( dd.trg, dd.pl, EVENT_PLAYER_LEAVE )
    call TriggerRegisterDeathEvent( dd.trg, Runner )
    call TriggerRegisterUnitEvent( dd.trg, Runner, EVENT_UNIT_DAMAGED )
    
    call TriggerRegisterTimerEvent( dd.trg, 0.03125, true )
    
    if GetLocalPlayer( ) == dd.pl or IsPlayerAlly( GetLocalPlayer( ), dd.pl ) then
        call SetTextTagVisibility( dd.tt, true )
    else
        call SetTextTagVisibility( dd.tt, false )
    endif
    
    set pBuff = GetUnitAbility( dd.attacked, 'B00A' ) + 0x90
    set dd.c = TimerGetElapsed( DispTimer )
    call WMem( RMem( pBuff ) + 0x4, mR2I( dd.c + 15.10 ) )
    call WMem( RMem( pBuff ) + 0x8, mR2I( dd.c + 10.408 ) )
    call SetBuffLevel( pBuff - 0x90, ChargesCount )
    call UpdateAirportTrainingBar( dd.tt, 100, 100 )
    
    set Runner = null
endfunction
    
//===========================================================================
function InitTrig_Staff_of_Purification takes nothing returns nothing
    set udg__TempBarStyle = 0
endfunction
Выше пример баффа для предмета, который образует щит блокирующий урон, кол-во заблокированного урона и сколько еще заблокирует щит отображается над головой героя, в виде полоски здоровья (только цвет сине-красный). Так же в статуе есть бафф, один в 1 как бафф дефектных способностей вара, не складывается - новый, перебивает старый. И так далее...
ответ
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
ответ
Ну сперва ты конвертируешь хендл в адресс, после ты задаёшь от адреса отступ, чтобы попасть в нужную ячейку структуры объекта, как до неё добраться нужно смотреть в чит енджине или дезасамблировать игру и вникать в логику работы интересующих тебя вещей.
ответ
Берем и тестируем, там есть как и стак так и перебивание, независимая работа каждого.

23

» Администрация XGM / Скриншоты

Похожие вопросы:

ответ
ответ
возможно кривой формат
поддерживаемые форматы : png, jpg
а вообще вот инструкция
ответ
Лан, всё равно
ответ
Члена Администрации нельзя лишить прав внутри обычного проекта или блога.

23

» WarCraft 3 / Баг текстуры

Похожие вопросы:

ответ
~2Serious4Die:
Вообщем разобрался в чем проблема, я использовал текстуры с размером 250*250 а надо было 256*256, так как варе чтоб не было такова нужно использовать текстуры равные 2 в степени, то есть 2,4,8,16,32,64,128 и т.д.
ответ
текстура не отображается при неправильном формате blp, чаще всего — при отсутствии сжатия
ответ
~8gabriel8:
Сделал заодно со своим вопросом:
ответ
Редактирование текстуры в ME - выравнивание ширины и высоты
ответ
  1. В мдлвисе ставим фейковые точки далеко за пределами физических границ модели
  2. В War3Me нажимаем - рассчитать границы и сохранить
Повторяем пункт 1 до тех пор пока не подберём оптимальные границы
В общем просто центр модели пропадает из пределов камеры, и игра её не рендерит, багу моделей столько же лет сколько и варкарфту

23

» WarCraft 3 / Способы инкома

Похожие вопросы:

ответ
хотя ладно я сейчас добрый так что лови совет
вместо игрок 1 используй владелец выбранного юнита
и вместо того чтобы сразу добавлять ресурсы заноси их в переменную
и добавляй в конце
Nosferoh, сори но то что ты сказал это не оптимально
зачем усложнять ?
ответ
Сделал.

23

» WarCraft 3 / Неприятный лимит

Похожие вопросы:

ответ
была такая проблема, решилась только костылями:
  • при мгновенной смерти большого числа героев часть воскресает немедленно
  • стоят проверки, если герой все же исчез - создать нового, дав ему все необходимые параметры и предметы

23

» WarCraft 3 / Как сделать такой хп-бар

Похожие вопросы:

ответ
Где-то я видел наработку с этими хр барами.
Найдётся в ресурсах пользователя JesusHipster.
ответ
то, что оно скрывает панель, это лишь часть свойств этого флага. Что оно еще дает, я не в курсе.
ответ
А много ли юнитов будут с хп баром? если серьёзно то решения нет и фрейм не найти этот, оно зашито в недра движка. Но опять таки Disable pre-selection вариант всё таки, если потом отрисовать кастомные хп бары через специальную модель, если она будет эффектом, то это не вызовет никакой доп нагрузки даже у 100 юнитов.

23

» WarCraft 3 / Не работает специальная вставка

Похожие вопросы:

ответ
потому что ты не должен закрывать мдлвис, а скопировать, и прямо из него открыть новую модель